package com.lcy.algorithm.huawei;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

/**
 * 题目描述︰幼儿园组织活动，老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。我们将这些数量汇总到数组garden中。
 * 请根据这些小朋友给出的信息，请计算班级至少有多少个小朋友?
 * 输入描述∶输入: garden[]= {2,2,3}
 * 说明︰
 * garden数组长度最大为999
 * 每个小区的小朋友数量最多1000人，也就是garden[i]的范围为[0,999]
 * 输出描述∶输出∶7
 *
 * 示例1
 * 输入∶
 * 2 2 3
 * 输出∶7
 * 说明∶解释∶
 * 第一个小朋友反馈有两个小朋友和自己同一小区，即此小区有3个小朋友
 * 第二个小朋友反馈有两个小朋友和自己同一小区，即此小区有3个小朋友。这两个小朋友，可能是同一小区的，且此小区的小朋友只有3个人。
 * 第三个小区反馈还有3个小朋友与自己同一小区，则这些小朋友只能是另外一个小区的。这个小区有4个小朋友。
 */
public class 小朋友来自多少小区 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        try {
            int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            System.out.println(getResult(nums));
        } catch (Exception e) {
            System.out.println("0");
        }
    }

    public static int getResult(int[] nums) {
        //记录每个人数相同的小区有多少小朋友反馈
        HashMap<Integer, Integer> cnts = new HashMap<>(nums.length);

        for (int num : nums) {
            cnts.put(num, cnts.getOrDefault(num, 0) + 1);
        }

        // 小朋友人数
        int friendNum = 0;
        // 小区数
        int areaNum = 0;
        for (int key : cnts.keySet()) {
            // key是反馈，假设某小朋友反馈有key个人和自己一个小区，那么该小区总人数为total = key+1
            int total = key + 1;
            if(key <= total){
                friendNum += total;
                areaNum += 1;
            }else{
                //如果小朋友的数量大于了total，那么肯定有人在不同的小区，需要用进行分组取整
                friendNum += Math.ceil(cnts.get(key) / total) * total;
                areaNum +=Math.ceil(cnts.get(key) / total);
            }
        }

//        return friendNum;
        return areaNum;
    }
}
